package com.sdy.approval.api;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.sdy.common.model.BizException;
import org.omg.CORBA.INTERNAL;
import org.springframework.cloud.openfeign.FeignClient;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sdy.approval.biz.model.TpApproveFlow;
import com.sdy.approval.biz.model.TpApproveFlowConfig;
import com.sdy.approval.biz.model.TpOrder;
import com.sdy.common.model.Response;

@FeignClient("sdy-approval")
public interface ApprovalAllApi {

//----------------------------------------------------------------------------------
	/**
	 * 外部申请入口
	 * @param list
	 * @return
	 */
	Integer lookResId(List<Map<String, Object>> list) throws BizException;

	/**
	 * 通过资源id查询流程配置
	 * @param resId 资源id (E：resId = "[资源目录]37")
	 * @return
	 */
	List<TpApproveFlowConfig> selectApprovalByResId(String resId);

	/**
	 * 根据订单号查询当前订单
	 * @param applyNum 订单号
	 * @param orderAvailable (1.查询当前的订单 null.查询历史和当前订单)
	 * @return
	 */
	List<TpOrder> selectOrderByApplyNum(String applyNum, Integer orderAvailable);

	/**
	 * 修改订单时删除冗余数据
	 * @param applyNum 订单号
	 * @return
	 */
	Integer delOrderAndFlowsByApplyNum(String applyNum, Integer userId) throws BizException;

	/**
	 * 根据订单号查询所有流程（历史版本 and 最新版本）
	 * @param applicationNum 订单号
	 * @return
	 */
	List<TpApproveFlow> selectApprovalFlowByResId(String applicationNum);

	/**
	 * 根据订单号查询当前用户的审批流程
	 * @param applicationNum 订单号
	 * @param deptIdList 登陆人员的部门id列表
	 * @param roldIdList 登陆人员的角色id列表
	 * @return
	 */
	TpApproveFlow selectApprovalFlowResultByResId(String applicationNum ,List<Integer> deptIdList, List<Integer> roldIdList);

	/**
	 * 根据订单号查询当前用户的审批流程
	 * @param applyIdList 订单号
	 * @param deptIdList 登陆人员的部门id列表
	 * @param roleIdList 登陆人员的角色id列表
	 * @return
	 */
	List<TpApproveFlow> selectApprovalFlowByNumOrderList(List<String> applyIdList, List<Integer> deptIdList, List<Integer> roleIdList);

	/**
	 * 根据订单号查询当前用户的审批流程(实施工单查询专供)
	 * @param applyIdList 订单号
	 * @param deptIdList 登陆人员的部门id列表
	 * @param roleIdList 登陆人员的角色id列表
	 * @return
	 */
	List<TpApproveFlow> selectApprovalFlowByNumToDir(List<String> applyIdList, List<Integer> deptIdList, List<Integer> roleIdList);

	/**
	 * 流程体系新建（即新建流程配置）
	 * @param auditDepartmentId 配置节点所需部门id
	 * @param auditRoleId 配置节点所需角色id
	 * @param prefix 平台前缀，如：[查询平台]
	 * @param rId 该平台的资源id；资源主键
	 * @return
	 * @throws Exception
	 */
	String insertApproval(List<Integer> auditDepartmentId , List<Integer> auditRoleId, String prefix, String rId) throws Exception;

	/**
	 * 删除流程的配置信息
	 * @param prefix 前缀 E:[查询平台]
	 * @param rId 资源id(主键)
	 * @return
	 */
	Boolean deleteFlowConfig(String prefix, Integer rId);

	/**
	 * 我的订阅申请表单详情(未提交)
	 * @return
	 */
	List<TpOrder> selectAllTpResOrderListNotSubmitted();

	/**
	 * 流程修改(隐藏流程数据)
	 * @param applicationNum 修改的订单号
	 * @param userId 修改人的id
	 * @return
	 */
	Boolean updateFlow(String applicationNum, Integer userId) throws BizException;

	/**
	 * 我的订阅申请表单详情(单条，详情，点击申请单号查看，审批明细TpApproveFlow)
	 * @param application_num 击数据传入TpOrder内的申请单号
	 * @return
	 */
	Response<List<TpApproveFlow>> selectApprovalDeilByApplicationNum(String application_num);

	/**
	 * 单条申请
	 * @param applicationNum 提交申请时传入申请单号
	 * @param userId 提交人的id
	 * @return
	 */
	Integer updateApprovalNotToYes(String applicationNum, Integer userId, Integer operType, Date date) throws BizException;

	/**
	 * 我的订阅申请表单(状态【未提交转提交】多条)
	 * @param applicationNumList 提交时传入的申请单号集合
	 * @param resIdList 资源id
	 * @param userIdList 人员id
	 * @return
	 */
	Integer updateApprovalNotToYesMany(List<String> applicationNumList, List<String> resIdList, List<Integer> userIdList) throws BizException;

	/**
	 * 我的订阅申请表单(撤回)
	 *
	 * @param applicationNum 撤回的订单号
	 * @param userId         当前操作人员id
	 * @param date           时间
	 * @param type            操作类型
	 * @return
	 */
	Boolean withdraw(String applicationNum, Integer userId, Date date, Integer type) throws BizException;

	/**
	 * 审批列表(多条件)
	 * @param deptIdList 登陆人的部门id集
	 * @param roldIdList 登陆人的角色id集
	 * @param result 1未审批  2审批   根据流程节点状态查询
	 * @param applyNum 根据订单号模糊查询
	 * @param gsOrderState 订单的状态
	 * @param prefix 资源id前缀
	 * @return
	 */
	List<TpOrder> selectTpOrderApprovalByCondition( List<Integer> deptIdList, List<Integer> roldIdList, Integer result,
													String applyNum, Integer gsOrderState, String prefix);
	/**
	 * 审批列表(不分页)
	 * @param deptIdList 登陆人的部门id集
	 * @param roldIdList 登陆人的角色id集
	 * @param result 1未审批  2审批   根据流程节点状态查询
	 * @param prefix 资源id前缀
	 * @return
	 */
	List<String> selectMyApprovalTable(List<Integer> deptIdList, List<Integer> roldIdList, Integer result, String prefix);

	/**
	 * 审批
	 * @param tpApproveFlow ApplyId[订单号]；Result[审批结果]；UserId[当前操作人]；ResId[资源id]
	 * @param deptIdList 当前操作人员部门id列表
	 * @param roleIdList 当前操作人员角色id列表
	 * @return
	 * @throws Exception
	 */
	Integer updateNodeApprovalResults(TpApproveFlow tpApproveFlow, List<Integer> deptIdList, List<Integer> roleIdList) throws Exception;


	/**
	 * ip审批
	 * @param tpApproveFlow ApplyId[订单号]；Result[审批结果]；UserId[当前操作人]；ResId[资源id]
	 * @param deptIdList 当前操作人员部门id列表
	 * @param roleIdList 当前操作人员角色id列表
	 * @param deptBaseId 数据局id
	 * @param roleBaseId 数据局审批角色id
	 * @return
	 * @throws Exception
	 */
	Integer updateIpNodeApprovalResults(TpApproveFlow tpApproveFlow, List<Integer> deptIdList, List<Integer> roleIdList,Integer deptBaseId, Integer roleBaseId) throws Exception;

	/**
	 * 根据部门角色和平台前缀查询资源id
	 * @param deptIdList 部门id集合
	 * @param roleIdList 角色is集合
	 * @param prefix 资源id前缀
	 * @return
	 * @throws BizException
	 */
	List<String> selectByDeptAndRole(List<Integer> deptIdList, List<Integer> roleIdList, String prefix) throws BizException;

	/**
	 * 当前审批节点查询
	 * @param applyNum 订单号
	 * @param deptIdList 登陆人员部门信息
	 * @param roleIdList 登陆人员角色信息
	 * @param prefix 平台前缀 E："[资源目录]"
	 * @return
	 */
	Integer selectCurrentFlowLink(String applyNum, List<Integer> deptIdList, List<Integer> roleIdList, String prefix) throws BizException;

	/**
	 * 批量当前审批节点查询
	 * @param applyNumList 订单号
	 * @param deptIdList 登陆人员部门信息
	 * @param roleIdList 登陆人员角色信息
	 * @param prefix 平台前缀 E："[资源目录]"
	 * @return
	 */
	List<Integer> selectCurrentFlowLinkList(List<String> applyNumList, List<Integer> deptIdList, List<Integer> roleIdList, String prefix) throws BizException;

	/**
	 * 订阅审批表单(多条件)
	 * @param page
	 * @param deptIdList 登陆人的部门id集
	 * @param roldIdList 登陆人的角色id集
	 * @param result 1未审批  2审批   根据流程节点状态查询
	 * @param applyNums 根据订单号模糊查询
	 * @param gsOrderState 订单的状态
	 * @param prefix 资源id前缀
	 * @return
	 */
	IPage<TpOrder> selectTpOrderApprovalToDir(Page<TpOrder> page, List<Integer> deptIdList, List<Integer> roldIdList,
											  Integer result, List<String> applyNums, Integer gsOrderState, String prefix);

	/**
	 * 事项录入订阅审批表单
	 * @param deptIdList 当前操作人员部门id列表
	 * @param roldIdList 当前操作人员角色id列表
	 * @param result 当前节点审批结果
	 * @return
	 */
	List<TpOrder> selectTpOrderApprovalToTMatter(List<Integer> deptIdList, List<Integer> roldIdList, Integer result);

	/**
	 * 事项录入查询节点信息
	 * @param applicationNum 数据的订单号
	 * @return
	 */
	List<TpApproveFlow> selectApprovalFlowByTMatterResId(String applicationNum);

	/**
	 * 事项录入申请（新增未提交申请到order）
	 * @param id 主键id
	 * @param resId 资源id
	 * @param userId 人员id
	 * @param randomNum 订单号
	 * @return Boolean
	 */
	Boolean insertRcToOrder(Integer id, String resId, Integer userId, String randomNum) throws BizException;

    /**
     * 资源目录,下架后干涉到流程的发布
     * @param auditDepartmentId
     * @param auditRoleId
     * @param prefix
     * @param rId
     * @return
     * @throws Exception
     */
	Integer lowerShelfRes(List<Integer> auditDepartmentId, List<Integer> auditRoleId, String prefix, Integer rId, Integer moveUser, Date date) throws Exception;

	/**
	 * ip修改申请单
	 * @param list
	 * @return
	 */
	Integer ipUpdateOrderCreate(List<Map<String, Object>> list) throws BizException;

	/**
	 * ip修改申请单生成
	 * @param applicationNum
	 * @param userId
	 * @param operType
	 * @param date
	 * @param resPower
	 * @param deptBaseId
	 * @param sourceDeptId
	 * @param approvalUserId
	 * @return
	 */
	Integer ipUpdateApprovalNotToYes(String applicationNum, Integer userId, Integer operType, Date date, Integer resPower, Integer deptBaseId, Integer sourceDeptId,Integer approvalUserId) throws BizException;

	/**
	 * 多条修改申请单生成
	 * @param applicationNumList
	 * @param resIdList
	 * @param userIdList
	 * @param resPowerList
	 * @param deptBaseId
	 * @param sourceDeptIdList
	 * @return
	 * @throws BizException
	 */
	Integer ipUpdateApprovalNotToYesMany(List<String> applicationNumList, List<String> resIdList, List<Integer> userIdList, List<Integer> resPowerList, Integer deptBaseId, List<Integer> sourceDeptIdList, Integer approvalUserId) throws BizException;

	/**
	 * 测试api
	 * @return
	 * @throws BizException
	 */
	Integer testApi(Map<String, Object> map) throws Exception;

}

